home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-11-06 | 3.1 KB | 111 lines | [TEXT/KAHL] |
- // ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
- // • Program: FrameAnim
- // • File: VBlank.c
- // •
- // • Copyright © 1993 by Scott B. Steinman, O.D., Ph.D. All Rights Reserved.
- // ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
-
- #include "FrameAnim.h"
-
- // • ------------------ External Globals ----------------------------------
-
- extern CWindowPtr gMainWindow; // • From Main.c file
- extern GWorldPtr gFrames[]; // • From Main.c file
- extern GDHandle gDevice; // • From Main.c file
- extern Settings gSettings; // • From Main.c file
-
- // • ------------------ Globals -------------------------------------------
-
- XVBLTask gXVBLTask;
-
- // •------------------- Static Variables ----------------------------------
-
- static short sSlotNum;
- static OSErr sErr;
-
- // • ------------------ Set Up VBlank Interrupt Timing Task ---------------
-
- void
- SetUpVBlankAnimation( void )
- // •
- // • Initiates VBlank interrupt task to time transfer of GWorlds to screen.
-
- {
- AuxDCEHandle devCtl = NullHandle;
-
- HLock( (Handle) gDevice );
- devCtl = (AuxDCEHandle) GetDCtlEntry( (**gDevice).gdRefNum );
- HLock( (Handle) devCtl );
- sSlotNum = (**devCtl).dCtlSlot;
- HUnlock( (Handle) devCtl );
- HUnlock( (Handle) gDevice );
-
- gXVBLTask.vbl.vblAddr = (ProcPtr) VideoProc;
- gXVBLTask.vbl.qType = vType;
- gXVBLTask.vbl.vblCount = 0; // • Initially disable VBlank task
- gXVBLTask.vbl.vblPhase = 0;
- gXVBLTask.a5 = SetCurrentA5(); // • Get program's current A5
-
- gXVBLTask.frames = gSettings.numFrames;
- gXVBLTask.frameDelay = gSettings.frameDelay;
- gXVBLTask.frameIndex = -1; // • Will be set to 0 on first VBlank
- gXVBLTask.showFrame = false; // • Disable showing frame
-
- if (sSlotNum >= 0)
- sErr = SlotVInstall( (QElemPtr) &gXVBLTask, sSlotNum );
- else
- sErr = VInstall( (QElemPtr) &gXVBLTask );
- }
-
- // • ------------------ Remove VBlank Interrupt Timing Task ---------------
-
- void
- ShutDownVBlankAnimation( void )
- // •
- // • Removes our vertical blank task from interrupt queue.
- {
- gXVBLTask.frameIndex = -1;
- gXVBLTask.vbl.vblCount = 0;
-
- if (gXVBLTask.vbl.vblAddr != (ProcPtr) VideoProc )
- return;
- if (sSlotNum >= 0)
- sErr = SlotVRemove( (QElemPtr) &gXVBLTask, sSlotNum );
- else
- sErr = VRemove( (QElemPtr) &gXVBLTask );
- }
-
- // • ------------------ Increment Frame Number (VBlank Task Routine) ------
-
- #pragma options(assign_registers,redundant_loads)
-
- void
- VideoProc( void )
- // •
- // • Increment frame number of pre-recorded animation
- // • sequence in sync with vertical blank interrupt.
- {
- long currA5;
- XVBLTaskPtr theVBLTask;
-
- // • Get our task record from A0 register
-
- theVBLTask = (XVBLTaskPtr) GetVBLRec();
-
- currA5 = SetA5( theVBLTask->a5 );
-
- if (theVBLTask->frameIndex < theVBLTask->frames) {
- theVBLTask->frameIndex++; // • Set next frame number
- theVBLTask->showFrame = true; // • Show this frame
-
- // • Reset VBL countdown
- theVBLTask->vbl.vblCount = theVBLTask->frameDelay;
- }
- else {
- theVBLTask->showFrame = false; // • Don't display frame
- theVBLTask->vbl.vblCount = 0; // • Inhibit VBL task
- }
-
- currA5 = SetA5( currA5 );
- }
-